//! 钱包模块 - 管理用户的加密密钥对

use ring::signature::{Ed25519KeyPair, KeyPair};
use rand::RngCore;
use hex;

/// 用户钱包（核心是管理密钥对）
pub struct Wallet {
    /// ED25519 密钥对（包含私钥和公钥）
    key_pair: Ed25519KeyPair,
}

impl Wallet {
    /// 创建新钱包（生成随机密钥对）
    /// # 安全说明
    /// 使用系统级安全随机数生成种子（32字节）
    pub fn new() -> Self {
        // 创建密码学安全的随机数生成器
        let mut rng = rand::thread_rng();
        // 生成32字节随机种子（ED25519算法要求）
        let mut seed = [0u8; 32];
        rng.fill_bytes(&mut seed);
        
        // 从种子生成密钥对
        let key_pair = Ed25519KeyPair::from_seed_unchecked(&seed)
            .expect("密钥对生成失败，请检查随机数生成器"); // .expect("Failed to generate key pair");

        Wallet { key_pair }
    }

    /// 获取钱包地址（公钥的十六进制字符串）
    /// # 注意
    /// 这是其他用户向该钱包转账时使用的标识
    pub fn public_key(&self) -> String {
        hex::encode(self.key_pair.public_key().as_ref())
    }

    /// 获取密钥对的只读引用（用于交易签名）
    /// # 安全警告
    /// 应确保调用环境安全，防止私钥泄露
    pub fn key_pair(&self) -> &Ed25519KeyPair {
        &self.key_pair
    }
}
